package cn.kennylee.codehub.mq.lip.integration.base.anno;

import java.lang.annotation.*;

/**
 * <p> MQ消费者配置注解 </p>
 * <p>Created on 2025/4/18.</p>
 *
 * @author kennylee
 * @since 0.0.1
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IntegrationMqConsumer {
    /**
     * 消息中间件类型
     */
    MqType type() default MqType.ROCKET_MQ;

    /**
     * 主分类标识 核心业务分类（如：order, payment），对应 RocketMQ 的 Topic 或 Kafka 的主 Topic
     *
     * @return 主分类标识
     */
    String channel();

    /**
     * 子分类标识 业务子分类（如：order.create, order.cancel），对应 RocketMQ 的 Tag 或 Kafka 的子 Topic
     *
     * @return 子分类标识
     */
    String[] routerKeys() default "*";

    /**
     * <p>消费者组</p>
     * <p>注意组名不要重复，默认组名生成规则是，类名+方法名+环境标识，一般消费者都在1个中心的话不会重复，但如果分布不同中心，存在问题。</p>
     *
     * @return 消费者组名称
     * @see AbstractRocketMqListener#generateConsumerGroup()
     */
    String consumerGroup() default "";

    /**
     * 是否添加tag的profile后缀
     *
     * @return 是否添加tag的profile后缀
     */
    boolean enableTagSuffix() default true;

    /**
     * 是否添加consumerGroup的profile后缀
     *
     * @return 是否添加consumerGroup的profile后缀
     */
    boolean enableGroupSuffix() default true;

    /**
     * 每个线程消费消息数
     * <p>注：如果consumeThreadMax和consumeThreadNumber都是1就可以单队列，不担心并发问题了</p>
     *
     * @return 每个线程消费消息数
     */
    int consumeThreadNumber() default 20;

    /**
     * 消费线程号占位符，多个线程消费时使用
     * 优先级高于 {@link #consumeThreadNumber()}
     * <p>例如：${rocketmq.consumer.thread-number-holder}</p>
     */
    String consumeThreadNumberHolder() default "";

    /**
     * 消息中间件类型枚举
     */
    enum MqType {
        /**
         * RocketMQ
         */
        ROCKET_MQ,
        /**
         * RabbitMQ
         */
        RABBIT_MQ,
        /**
         * Kafka
         */
        KAFKA
    }

}
